package cn.iocoder.yudao.module.ad.framework.core.channel;


import cn.iocoder.yudao.module.ad.api.advertiser.dto.AdvertiserRespDTO;
import cn.iocoder.yudao.module.ad.api.channel.dto.ClueSyncReqDTO;
import cn.iocoder.yudao.module.ad.api.channel.dto.ClueSyncRespDTO;
import cn.iocoder.yudao.module.ad.api.channel.dto.TokenGenRespDTO;
import cn.iocoder.yudao.module.ad.framework.core.properties.AdChannelProperties;
import lombok.Getter;

import java.util.List;
import java.util.Map;

/**
 * 媒体平台的事件上报接口
 *
 */
@Getter
public abstract class AdChannelClient {

    public AdChannelProperties properties;

    public AdChannelClient(AdChannelProperties properties) {
        this.properties = properties;
    }

//    public AdChannelProperties getProperties() {
//        return properties;
//    }

    /**
     * 同步线索
     * @return
     */
    public abstract List<ClueSyncRespDTO> getClue(ClueSyncReqDTO reqDTO);

    /**
     * 同步获取accessToken ，并压入缓存中
     * @param params 一般是同步授权url返回的auth_code 等参数
     * @since 2024-06-17
     * @author PetePower
     * @return
     */
    public abstract TokenGenRespDTO genToken(Map<String, String> params);

    /**
     * 获取广告账户列表
     * @param accessToken
     * @since 2024-07-05
     * @author PetePower
     * @return
     */
    public abstract List<AdvertiserRespDTO> getAdvertiserList(String accessToken);


    /**
     * 获取广告账户下的广告主列表
     * @param accessToken
     * @since 2024-07-05
     * @author PetePower
     * @return
     */
    public abstract List<AdvertiserRespDTO> getAdvertiserAccountList(String accessToken, String advertiserId);


    /**
     * 刷新token
     * @since 2024-07-01
     * @author PetePower
     */
    public abstract TokenGenRespDTO refreshToken(String accessToken, String refreshToken);


    /**
     * 同步获取授权地址， 有些平台是不需要url web端授权的， 直接抛出即可
     * 类似于快手-磁力引擎的， 获取accessToken 是需要网页web url 授权的
     * 那么在这个sdk中返回 web auth url 地址给前端用户。
     *
     * @since 2024-07-01
     * @author PetePower
     * @return
     */
    public abstract String genAuthUrl();




    public final void refresh(AdChannelProperties properties) {
        this.properties = properties;
    }
}
